package dataclass


/**
 * 数据类
 *
 * 编译器自动从主构造函数中声明的所有属性导出以下成员：
 * equals()/hashCode() 对；
 * toString() 格式是 "User(name=John, age=42)"；
 * componentN() 函数 按声明顺序对应于所有属性；
 * copy() 函数
 *
 * 为了确保生成的代码的一致性和有意义的行为，数据类必须满足以下要求：
 * 主构造函数需要至少有一个参数；
 * 主构造函数的所有参数需要标记为 val 或 var；
 * 数据类不能是抽象、开放、密封或者内部的；
 *（在1.1之前）数据类只能实现接口。
 *
 */
data class User(val name: String, val age: Int)

/**
 * 在 JVM 中，如果生成的类需要含有一个无参的构造函数，则所有的属性必须指定默认值
 */
data class User1(val name: String = "", val age: Int = 0)

/**
 *  请注意，对于那些自动生成的函数，编译器只使用在主构造函数内部定义的属性。
 *  如需在生成的实现中排出一个属性，请将其声明在类体中
 */
data class User2(val name: String) {
    var age: Int = 0
}

fun main(args: Array<String>) {

    //在很多情况下，我们需要复制一个对象改变它的一些属性，但其余部分保持不变。 copy() 函数就是为此而生成。对于上文的 User 类
    val jack = User(name = "Jack", age = 1)
    val olderJack = jack.copy(age = 2)
    println(olderJack)
}